/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.thienloc.omap.controller.module;

import com.thienloc.omap.controller.AbstractCrudBean;
import com.thienloc.omap.entity.ModuleConfig;
import com.thienloc.omap.session.ModuleConfigFacade;
import com.thienloc.omap.util.JsfUtil;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 *
 * @author GiangLT
 */
@ManagedBean
@ViewScoped
public class ModuleConfigBean extends AbstractCrudBean {

    @EJB
    private ModuleConfigFacade facade;
    private ModuleConfig selected;
    private List<ModuleConfig> list;
    private ModuleConfig[] selectedList;
    private Map<String, Long> configMap;
    private Integer selectedParentId;
    private Map<String, String> moduleMap;
    private String selectedModule;

    public void filterByModule() {
        try {
            list = facade.find(selectedModule);
        } catch (Exception ex) {
            logAndNotifyError(ex);
        }
    }

    @Override
    protected void validateForm() throws Exception {
    }

    @Override
    protected Logger getLogger() {
        return LoggerFactory.getLogger(ModuleConfigBean.class);
    }

    @Override
    protected void resetToCreateFormAction() throws Exception {
        list = facade.findAll();
        selected = new ModuleConfig();
        edit = false;
        view = false;

        configMap = new TreeMap<String, Long>();
        configMap.put("-Không có cấp trên-", 0L);
        for (ModuleConfig moduleConfig : list) {
            configMap.put(String.valueOf(moduleConfig.getConfigId()), moduleConfig.getConfigId());
        }

        moduleMap = new TreeMap<String, String>();
        List<String> moduleNames = facade.getModuleNames();
        for (String moduleName : moduleNames) {
            moduleMap.put(moduleName, moduleName);
        }
    }

    @Override
    protected void findSelected(int id) throws Exception {
        facade.find(id);
    }

    @Override
    protected void createSelected() throws Exception {
        if (selectedParentId != 0) {
            selected.setParentConfigId(facade.find(selectedParentId));
        }
        facade.create(selected);
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã thêm mới thành công một bản ghi");
    }

    @Override
    protected void editSelected() throws Exception {
        if (selectedParentId != 0) {
            selected.setParentConfigId(facade.find(selectedParentId));
        }
        facade.edit(selected);
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã cập nhật thành công một bản ghi");
    }

    @Override
    protected void removeSelected() throws Exception {
        int size = selectedList.length;
        if (size == 0) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Không có gì để xóa", "Hãy click chọn các bản ghi cần xóa");
            return;
        }
        for (ModuleConfig item : selectedList) {
            facade.remove(item);
        }
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã xóa thành công " + size + " bản ghi");
    }

    @Override
    protected void prepareViewAction() throws Exception {
        view = true;
        edit = false;
        if (selectedList == null || selectedList.length == 0) {
            JsfUtil.addErrorMessage("Lỗi", "Bạn chưa tích chọn bản ghi cần hiển thị");
            return;
        }
        selected = selectedList[0];
        if (selectedList.length > 1) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Cảnh báo hiển thị", "Bạn đã chọn nhiều hơn 1 bản ghi. Chỉ bản ghi trên cùng được hiển thị");
        }
    }

    @Override
    protected void prepareEditAction() throws Exception {
        view = false;
        edit = true;
        if (selectedList == null || selectedList.length == 0) {
            JsfUtil.addErrorMessage("Lỗi", "Bạn chưa tích chọn bản ghi cần hiển thị");
            return;
        }
        selected = selectedList[0];
        if (selectedList.length > 1) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Cảnh báo hiển thị", "Bạn đã chọn nhiều hơn 1 bản ghi. Chỉ bản ghi trên cùng được hiển thị");
        }
    }

    public List<ModuleConfig> getList() {
        return list;
    }

    public void setList(List<ModuleConfig> list) {
        this.list = list;
    }

    public ModuleConfig getSelected() {
        return selected;
    }

    public void setSelected(ModuleConfig selected) {
        this.selected = selected;
    }

    public Map<String, Long> getConfigMap() {
        return configMap;
    }

    public void setConfigMap(Map<String, Long> configMap) {
        this.configMap = configMap;
    }

    public Integer getSelectedParentId() {
        return selectedParentId;
    }

    public void setSelectedParentId(Integer selectedParentId) {
        this.selectedParentId = selectedParentId;
    }

    public Map<String, String> getModuleMap() {
        return moduleMap;
    }

    public void setModuleMap(Map<String, String> moduleMap) {
        this.moduleMap = moduleMap;
    }

    public String getSelectedModule() {
        return selectedModule;
    }

    public void setSelectedModule(String selectedModule) {
        this.selectedModule = selectedModule;
    }

    public ModuleConfig[] getSelectedList() {
        return selectedList;
    }

    public void setSelectedList(ModuleConfig[] selectedList) {
        this.selectedList = selectedList;
    }
}
